/******************** (C) COPYRIGHT 2024 ANO Tech ********************************
 * 作者    ：匿名科创
 * 文件名  ：data_transfer.c
 * 描述    ：数据传输
 * 官网    ：www.anotc.com
 * 淘宝    ：anotc.taobao.com
 * 技术Q群 ：190169595
 * 备注    ：移植匿名上位机通信协议文件，在此声明！
**********************************************************************************/
#include "ANO_DT.h"
#include "usart.h"
#include "mpu6050.h"

//ANO的发送标志的数据结构
typedef struct FLAG_TYPE
{
	uint8_t send_version;
	uint8_t send_status;
	uint8_t send_senser;
	uint8_t send_rcdata;
	uint8_t send_motopwm;
	uint8_t send_power;
	uint8_t send_pid1;
	uint8_t send_pid2;
	uint8_t send_pid3;
	uint8_t send_pid4;
}FLAG_TYPE;


//数据拆分宏定义，在发送大于1字节的数据类型时，比如int16、float等，需要把数据拆分成单独字节进行发送
#define BYTE0(dwTemp)      ((dwTemp) & 0xFF)
#define BYTE1(dwTemp)      (((dwTemp) >> 8) & 0xFF)
#define BYTE2(dwTemp)      (((dwTemp) >> 16) & 0xFF)
#define BYTE3(dwTemp)      (((dwTemp) >> 24) & 0xFF)

u8 flag = 0;
uint8_t data_to_send[50];	//发送数据缓存


//Data_Exchange函数处理各种数据发送请求，比如想实现每5ms发送一次传感器数据至上位机，即在此函数内实现
void ANO_DT_Send_Data(uint8_t *dataToSend, uint8_t length)
{
	usart_send(dataToSend, length);
}

void ANO_DT_Send_Check(uint8_t head, uint8_t check_sum)
{
	uint8_t sum = 0, i;
	data_to_send[0] = 0xAA;
	data_to_send[1] = 0xFF;
	data_to_send[2] = 0x00;
	data_to_send[3] = 3;
	data_to_send[4] = head;
	data_to_send[5] = check_sum;
	
	for (i = 0; i < 7; i ++)
		sum += data_to_send[i];
	data_to_send [7] = sum;
	ANO_DT_Send_Data(data_to_send, 8);
}

//向上位机发送欧拉姿态角
void ANO_DT_Send_EulerAngles(int16_t roll, int16_t pit, int16_t yaw)
{
	uint8_t i,sumcheck = 0, addcheck = 0;
	uint8_t data_to_send[12] = {0};
	
	data_to_send[0]=0xaa;
	data_to_send[1]=0xff;
	data_to_send[2]=0x03;
	data_to_send[3]=0x06;
	
	data_to_send[4] = BYTE0(roll);
	data_to_send[5] = BYTE1(roll);
	
	data_to_send[6]= BYTE0(pit);
	data_to_send[7]= BYTE1(pit);

	data_to_send[8]= BYTE0(yaw);
	data_to_send[9]= BYTE1(yaw);
	
	for(i=0; i < (data_to_send[3]+4); i++)
	{
		sumcheck += data_to_send[i]; //从帧头开始，对每一字节进行求和，直到DATA区结束
		addcheck += sumcheck; //每一字节的求和操作，进行一次sumcheck的累加
	}
	data_to_send[10]=sumcheck;
	data_to_send[11]=addcheck;
	
	ANO_DT_Send_Data(data_to_send, 12);
}


void ANO_DT_Send_Sensor(int16_t acc_x, int16_t acc_y, int16_t acc_z, int16_t Gyr_x, int16_t Gyr_y, int16_t Gyr_z, uint8_t shock_sta)
{
	uint8_t i,sumcheck = 0, addcheck = 0;
	uint8_t data_to_send[19]= {0};
	data_to_send[0] = 0xAA;
	data_to_send[1] = 0xFF;
	data_to_send[2] = 0x01;
	data_to_send[3] = 0x0D;
	
	data_to_send[4] = BYTE0(acc_x);
	data_to_send[5] = BYTE1(acc_x);
	
	data_to_send[6] = BYTE0(acc_y);
	data_to_send[7] = BYTE1(acc_y);
	
	data_to_send[8] = BYTE0(acc_z);
	data_to_send[9] = BYTE1(acc_z);
	
	data_to_send[10] = BYTE0(Gyr_x);
	data_to_send[11] = BYTE1(Gyr_x);
	
	data_to_send[12] = BYTE0(Gyr_y);
	data_to_send[13] = BYTE1(Gyr_y);
	
	data_to_send[14] = BYTE0(Gyr_z);
	data_to_send[15] = BYTE1(Gyr_z);
	
	data_to_send[16] = shock_sta;
	
	for (i = 0; i < (data_to_send[3]+4); i ++)
	{
		sumcheck += data_to_send[i];
		addcheck += sumcheck;
	}
	data_to_send[17] = sumcheck;
	data_to_send[18] = addcheck;
	ANO_DT_Send_Data(data_to_send, 19);
}

void ANO_DT_Send_Power(uint16_t votage, uint16_t current)
{
	uint8_t i,sumcheck = 0, addcheck = 0;
	uint8_t data_to_send[10]= {0};

	data_to_send[0] = 0xAA;
	data_to_send[1] = 0xFF;
	data_to_send[2] = 0x0D;
	data_to_send[3] = 0x04;
	
	data_to_send[4] = BYTE0(votage);
	data_to_send[5] = BYTE1(votage);
	
	data_to_send[6] = BYTE0(current);
	data_to_send[7] = BYTE1(current);
	
	for (i = 0; i < (data_to_send[3] + 4); i++)
	{
		sumcheck += data_to_send[i];
		addcheck += sumcheck;
	}
	data_to_send[8] = sumcheck;
	data_to_send[9] = addcheck;
	
	ANO_DT_Send_Data(data_to_send, 10);
}

void ANO_DT_Send_PWM(uint16_t m1, uint16_t m2, uint16_t m3, uint16_t m4, uint16_t m5, uint16_t m6, uint16_t m7, uint16_t m8)
{
	uint8_t i,sumcheck = 0, addcheck = 0;
	uint8_t data_to_send[4+16+2]= {0};
	
	data_to_send[0] = 0xAA;
	data_to_send[1] = 0xFF;
	data_to_send[2] = 0x20;
	data_to_send[3] = 0x10;
	
	data_to_send[4] = BYTE0(m1);
	data_to_send[5] = BYTE1(m1);
	data_to_send[6] = BYTE0(m2);
	data_to_send[7] = BYTE1(m2);
	data_to_send[8] = BYTE0(m3);
	data_to_send[9] = BYTE1(m3);
	data_to_send[10] = BYTE0(m4);
	data_to_send[11] = BYTE1(m4);
	data_to_send[12] = BYTE0(m5);
	data_to_send[13] = BYTE1(m5);
	data_to_send[14] = BYTE0(m6);
	data_to_send[15] = BYTE1(m6);
	data_to_send[16] = BYTE0(m7);
	data_to_send[17] = BYTE1(m7);
	data_to_send[18] = BYTE0(m8);
	data_to_send[19] = BYTE1(m8);
	
	for (i = 0; i < (data_to_send[3] + 4); i++)
	{
		sumcheck += data_to_send[i];
		addcheck += sumcheck;
	}
	data_to_send[20] = sumcheck;
	data_to_send[21] = addcheck;
	
	ANO_DT_Send_Data(data_to_send, 22);
}

void ANO_DT_Send_RCDate(int16_t Rol, int16_t PIT, int16_t THR, int16_t YAW, int16_t AUX1, int16_t AUX2, int16_t AUX3, int16_t AUX4, int16_t AUX5, int16_t AUX6)
{
	uint8_t i,sumcheck = 0, addcheck = 0;
	uint8_t data_to_send[4+20+2]= {0};
	
	data_to_send[0] = 0xAA;
	data_to_send[1] = 0xFF;
	data_to_send[2] = 0x40;
	data_to_send[3] = 0x14;
	
	data_to_send[4] = BYTE0(Rol);
	data_to_send[5] = BYTE1(Rol);
	data_to_send[6] = BYTE0(PIT);
	data_to_send[7] = BYTE1(PIT);
	data_to_send[8] = BYTE0(THR);
	data_to_send[9] = BYTE1(THR);
	data_to_send[10] = BYTE0(YAW);
	data_to_send[11] = BYTE1(YAW);
	data_to_send[12] = BYTE0(AUX1);
	data_to_send[13] = BYTE1(AUX1);
	data_to_send[14] = BYTE0(AUX2);
	data_to_send[15] = BYTE1(AUX2);
	data_to_send[16] = BYTE0(AUX3);
	data_to_send[17] = BYTE1(AUX3);
	data_to_send[18] = BYTE0(AUX4);
	data_to_send[19] = BYTE1(AUX4);
	data_to_send[20] = BYTE0(AUX5);
	data_to_send[21] = BYTE1(AUX5);
	data_to_send[22] = BYTE0(AUX6);
	data_to_send[23] = BYTE1(AUX6);
	for(i = 0; i < (data_to_send[3] + 4); i++)
	{
		sumcheck += data_to_send[i];
		addcheck += sumcheck;
	}
	data_to_send[24] = sumcheck;
	data_to_send[25] = addcheck;
	ANO_DT_Send_Data(data_to_send, 26);
}



/******************* (C) COPYRIGHT 2024 ANO TECH *****END OF FILE************/

